package com.sftz.framework.util;

import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;

import org.joda.time.DateTime;
import org.joda.time.DateTimeZone;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

import com.uxuexi.core.common.util.Util;

/**
 * 
 *  日期工具
 * <p>
 * @author   朱晓川
 * @Date	 2018年5月27日
 */
public class DateConvertUtil {
	/**东八区,北京时间CST*/
	public static final TimeZone TIME_ZONE_CST = TimeZone.getTimeZone(ZoneId.of("GMT+8"));

	private DateConvertUtil() {
	}

	/**
	 * 转为北京时间
	 * <p>
	 * 支持标准UTC和GMT格式:
	 * UTC:2018-08-14T06:44:53.000Z
	 * GMT:2018-08-13T15:55:59+0800
	 */
	public static Date toCST(String dateString) {
		if (Util.isEmpty(dateString)) {
			return null;
		}

		try {
			DateTime dateTime = DateTime.parse(dateString).withZone(DateTimeZone.forTimeZone(TIME_ZONE_CST));
			return dateTime.toDate();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 按照指定的日期格式将字符串转为北京时间
	 * <p>
	 * 例如:nginx日志中的时间格式 dd/MMM/yyyy:HH:mm:ss Z "15/Aug/2018:12:25:19 +0800"
	 * 
	 */
	public static Date toCST(String dateString, String pattern) {
		if (Util.isEmpty(dateString)) {
			return null;
		}
		DateTimeFormatter formatter = DateTimeFormat.forPattern(pattern).withLocale(Locale.US)
				.withZone(DateTimeZone.forTimeZone(TIME_ZONE_CST));
		try {
			DateTime dateTime = formatter.parseDateTime(dateString);
			return dateTime.toDate();
		} catch (Exception e) {
			e.printStackTrace();
			return null;
		}
	}

	/**
	 * 返回指定日期加上一段时长之后的日期，减去的话delta用负值即可
	 * <p>
	 * 时长单位列举:
	 * Calendar.[YEAR|MONTH|DATE|HOUR|MINUTE|SECOND etc.)
	 * 
	 * @param date  日期
	 * @param delta 时长
	 * @param unit  时长单位
	 */
	public static Date add(Date date, Integer delta, int unit) {
		Calendar c = parse2Calendar(date);
		//Calendar.YEAR
		c.add(unit, delta);
		return c.getTime();
	}

	/**
	 * 返回指定日期加上seconds之后的日期，减去的话seconds用负值即可
	 * <p>
	 * @param date    日期
	 * @param seconds 秒数
	 */
	public static Date addSeconds(Date date, Integer seconds) {
		Calendar c = parse2Calendar(date);
		c.add(Calendar.SECOND, seconds);
		return c.getTime();
	}

	/**日期转为日历*/
	public static Calendar parse2Calendar(Date date) {
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		return c;
	}
}
